home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -in_the_mag- / emulation / amiga / uae-0.7.0b2 / src / rpc.c < prev    next >
C/C++ Source or Header  |  1998-01-20  |  13KB  |  679 lines

  1.  /*
  2.   * UAE - The Un*x Amiga Emulator
  3.   *
  4.   * RiscPC Interface.
  5.   *
  6.   * (c) 1995 Bernd Schmidt
  7.   * (c) 1996 Gustavo Goedert
  8.   */
  9.  
  10. #include "sysconfig.h"
  11. #include "sysdeps.h"
  12.  
  13. #include "config.h"
  14. #include "options.h"
  15. #include "threaddep/penguin.h"
  16. #include "memory.h"
  17. #include "custom.h"
  18. #include "keyboard.h"
  19. #include "xwin.h"
  20. #include "keybuf.h"
  21. #include "gui.h"
  22.  
  23. typedef char flagtype;
  24.  
  25. extern struct regstruct
  26. {
  27.     ULONG regs[16];
  28.     CPTR  usp,isp,msp;
  29.     UWORD sr;
  30.     flagtype t1;
  31.     flagtype t0;
  32.     flagtype s;
  33.     flagtype m;
  34.     flagtype x;
  35.     flagtype stopped;
  36.     int intmask;
  37.     ULONG pc;
  38. #ifdef USE_POINTER
  39.     UBYTE *pc_p;
  40.     UBYTE *pc_oldp;
  41. #endif
  42.  
  43.     ULONG vbr,sfc,dfc;
  44.  
  45.     double fp[8];
  46.     ULONG fpcr,fpsr,fpiar;
  47.     ULONG spcflags;
  48.     ULONG kick_mask;
  49. } regs;
  50.  
  51.  
  52. #include "OS:wimp.h"
  53. #include "OS:font.h"
  54. #include "OS:os.h"
  55. #include "OS:osbyte.h"
  56. #include "OS:osword.h"
  57. #include "OS:sound.h"
  58.  
  59.  
  60. void gui_process(void);
  61.  
  62.  
  63. #define A_base 0x300000
  64. #define A_switch (A_base+0)
  65. #define A_disk (A_base+1)
  66. #define A_sonst (A_base+5)
  67. #define A_hf (A_base+6)
  68. #define A_mount (A_base+7)
  69. #define A_rom (A_base+10)
  70. #define A_uaeask (A_base+11)
  71.  
  72. int quit_program;
  73. int uae_running;
  74. int uae_startedup;
  75.  
  76. wimp_MESSAGE_LIST(13) messages=
  77.   {A_switch, A_disk, A_disk+1, A_disk+2, A_disk+3, A_sonst, A_rom, A_mount,
  78.    A_mount+1, A_mount+2, A_uaeask, message_PREQUIT, 0};
  79.  
  80. wimp_t taskhandle;
  81. wimp_t frontendhandle;
  82. wimp_block block;
  83. wimp_message mblock;
  84. int pollword;
  85.  
  86. os_MODE_SELECTOR(3) uaemode={1,0,0,0,-1,0,128,3,255,-1,0};
  87. os_MODE_SELECTOR(3) wimpmode;
  88.  
  89. extern void datavox_type(int channel, int type);
  90. extern void datavox_timed(int channel, int timed);
  91. extern void datavox_pitch(int channel, int pitch);
  92. extern void datavox_set_memory(int channel, char *start, char *end);
  93. extern void datavox_set_repeat(int channel, char *start, char *end);
  94. extern int datavox_allocate_channel(int key);
  95. extern void datavox_de_allocate_channel(int channel, int key);
  96.  
  97. int sratecode;
  98. char sbuffer[44100];
  99. int deskvoice, uaechannel;
  100.  
  101. extern int uaedevfd, numtracks;
  102.  
  103. char mountpoint[64];
  104. char mountdir[256];
  105.  
  106. char *scr;
  107. int screenrowbytes,screenrows;
  108.  
  109. char pressed[128];
  110. char translate[128]=
  111. {        255,    255,     255,  AK_LSH, AK_CTRL,     AK_LALT,  AK_RSH,     AK_CTRL, //0
  112.      AK_RALT,    255,     255,     255,     255,         255,     255,         255, //8
  113.     AK_Q,   AK_3,    AK_4,    AK_5,   AK_F4,        AK_8,   AK_F7,    AK_MINUS, //16
  114.      255,  AK_LF,  AK_NP6,  AK_NP7,     255,         255,  AK_F10,         255, //24
  115.      255,   AK_W,    AK_E,    AK_T,    AK_7,        AK_I,    AK_9,        AK_0, //32
  116.      255,  AK_DN,  AK_NP8,  AK_NP9,     255,AK_BACKQUOTE, AK_LTGT,       AK_BS, //40
  117.     AK_1,   AK_2,    AK_D,    AK_R,    AK_6,        AK_U,    AK_O,        AK_P, //48
  118.  AK_LBRACKET,  AK_UP,AK_NPADD,AK_NPSUB,  AK_ENT,         255,     255,     AK_RAMI, //56
  119.  AK_CAPSLOCK,   AK_A,    AK_X,    AK_F,    AK_Y,        AK_J,    AK_K,         255, //64
  120.      255, AK_RET,AK_NPDIV,     255,AK_NPDEL,         255, AK_LAMI,    AK_QUOTE, //72
  121.      255,   AK_S,    AK_C,    AK_G,    AK_H,        AK_N,    AK_L,AK_SEMICOLON, //80
  122.  AK_RBRACKET, AK_DEL,     255,AK_NPMUL,     255,    AK_EQUAL, AK_LTGT,         255, //88
  123.       AK_TAB,   AK_Z,  AK_SPC,    AK_V,    AK_B,        AK_M,AK_COMMA,   AK_PERIOD, //96
  124.     AK_SLASH,AK_HELP,  AK_NP0,  AK_NP1,  AK_NP3,         255,     255,         255, //104
  125.      255,  AK_F1,   AK_F2,   AK_F3,   AK_F5,       AK_F6,   AK_F8,       AK_F9, //112
  126. AK_BACKSLASH,  AK_RT,  AK_NP4,  AK_NP5,  AK_NP2,         255,     255,         255};//120
  127.  
  128. char dn0[256], dn1[256], dn2[256], dn3[256];
  129. int dc0=0, dc1=0, dc2=0, dc3=0;
  130.  
  131. /***************************************************************************/
  132.  
  133.  
  134. void setup_brkhandler(void)
  135. {
  136. }
  137.  
  138. void flush_line(int y)
  139. {
  140. }
  141.  
  142. void flush_block(int a, int b)
  143. {
  144. }
  145.  
  146. void flush_screen(int a, int b)
  147. {
  148. }
  149.  
  150. void calc_adjustment(void)
  151. {
  152. }
  153.  
  154.  
  155. static int colors_allocated;
  156.  
  157. static int get_color(int r, int g, int b, xcolnr *cnp)
  158. {
  159.     if (colors_allocated == 256)
  160.     return -1;
  161.     *cnp = colors_allocated;
  162.  
  163.     os_writec(19);
  164.     os_writec(colors_allocated);
  165.     os_writec(16);
  166.     os_writec(r+(r<<4));
  167.     os_writec(g+(g<<4));
  168.     os_writec(b+(b<<4));
  169.     colors_allocated++;
  170.  
  171.     return 1;
  172. }
  173.  
  174. static void init_colors(void)
  175. {
  176.     int rw = 5, gw = 5, bw = 5;
  177.     colors_allocated = 0;
  178.  
  179.     if (gfxvidinfo.pixbytes == 2)
  180.       alloc_colors64k(rw, gw, bw, 0, rw, rw+gw);
  181.     else
  182.       alloc_colors256(get_color);
  183. }
  184.  
  185. void sound_output(char *b, int l)
  186. {
  187.   memcpy(sbuffer, b, l);
  188.   datavox_set_memory(uaechannel, sbuffer, sbuffer+l);
  189.   datavox_set_repeat(uaechannel, sbuffer, sbuffer+l);
  190.   datavox_type(uaechannel, 1);
  191.   datavox_pitch(uaechannel, sratecode);
  192.   sound_control(uaechannel, 256+127, 0, 255);
  193. }
  194.  
  195. void init_mouse(void)
  196. {
  197.   oswordpointer_bbox_block bbox;
  198.  
  199.   bbox.op=oswordpointer_OP_SET_BBOX;
  200.   bbox.x0=-32768;
  201.   bbox.y0=-32768;
  202.   bbox.x1=32767;
  203.   bbox.y1=32767;
  204.   oswordpointer_set_bbox(&bbox);
  205. }
  206.  
  207. void setwimpmode(void)
  208. {
  209.   wimp_set_mode(&wimpmode);
  210.   while(osbyte2(145,0,0)!=0);
  211. }
  212.  
  213. void setuaemode(void)
  214. {
  215.   os_vdu_var_list varlist[2]={149,-1};
  216.   int valuelist[1];
  217.   os_mode m;
  218.  
  219.   m=osscreenmode_current();
  220.   memcpy(&wimpmode, m, os_SIZEOF_MODE_SELECTOR(3));
  221.  
  222.   osscreenmode_select(&uaemode);
  223.   os_read_vdu_variables(varlist, valuelist);
  224.   scr=(void *)valuelist[0];
  225.   gfxvidinfo.bufmem=scr;
  226.  
  227.   os_remove_cursors();
  228.  
  229.   init_colors();
  230.   init_mouse();
  231.  
  232.   flush_block(0, numscrlines-1);
  233. }
  234.  
  235. void setwimpsound(void)
  236. {
  237.   int s,t;
  238.  
  239.   sound_attach_voice(uaechannel, deskvoice, &s, &t);
  240.   datavox_de_allocate_channel(uaechannel, taskhandle);
  241. }
  242.  
  243. void setuaesound(void)
  244. {
  245.   int s;
  246.  
  247.   sound_volume(127);
  248.   uaechannel=datavox_allocate_channel(taskhandle);
  249.   printf("%d\n", uaechannel);
  250.   sound_attach_voice(uaechannel, 0, &s, &deskvoice);
  251.   sound_attach_named_voice(uaechannel, "DataVox-Voice");
  252. }
  253.  
  254. int graphics_init(void)
  255. {
  256.   __uname_control=6;
  257.  
  258.   switch(color_mode)
  259.   {
  260.     case 1:
  261.     case 2:
  262.     case 5:
  263.       uaemode.log2_bpp=4;
  264.       gfxvidinfo.pixbytes=2;
  265.       break;
  266.     default:
  267.       uaemode.log2_bpp=3;
  268.       gfxvidinfo.pixbytes=1;
  269.       break;
  270.   }
  271.  
  272.   uaemode.xres=gfx_requested_width;
  273.   uaemode.yres=gfx_requested_height;
  274.  
  275.   gfxvidinfo.rowbytes=gfx_requested_width*gfxvidinfo.pixbytes;
  276.   gfxvidinfo.maxlinetoscr=gfx_requested_width;
  277.   gfxvidinfo.maxline=gfx_requested_height;
  278.   gfxvidinfo.maxblocklines=0;
  279.  
  280.   setuaemode();
  281.   setuaesound();
  282.  
  283.   return 1;
  284. }
  285.  
  286. void graphics_leave(void)
  287. {
  288. }
  289.  
  290.  
  291. void readmouse(void)
  292. {
  293.   int x,y;
  294.   bits buttons;
  295.   os_t t;
  296.  
  297.   os_mouse(&x, &y, &buttons, &t);
  298.   lastmx=x>>1;
  299.   lastmy=gfx_requested_height-(y>>1);
  300.   buttonstate[0]=(buttons & 4)>>2;
  301.   buttonstate[1]=(buttons & 2)>>1;
  302.   buttonstate[2]=buttons & 1;
  303.   newmousecounters=0;
  304. }
  305.  
  306.  
  307. void processkey(char k, char release)
  308. {
  309.   if(k==29 && release==1)
  310.   {
  311.     uae_running=0;
  312.     setwimpmode();
  313.     setwimpsound();
  314.   }
  315.  
  316.   if(translate[k]!=255)
  317.     record_key((translate[k]<<1)+release);
  318. }
  319.  
  320.  
  321. void readkeyboard(void)
  322. {
  323.   char c,l,k,q;
  324.  
  325.   for(l=0, k=osbyte1(121, 0, 0), q=0; !q; l=k+1, k=osbyte1(121, l, 0))
  326.   {
  327.     if(k==0xff)
  328.     {
  329.       k=128;
  330.       q=1;
  331.     }
  332.     else
  333.     {
  334.       if(pressed[k]==0)
  335.       {
  336.     if (translate[k]!=0)
  337.       processkey(k, 0);
  338.     pressed[k]=1;
  339.       }
  340.     }
  341.     for(c=l; c<k; c++)
  342.     {
  343.       if(pressed[c]!=0)
  344.       {
  345.     if (translate[c]!=0)
  346.       processkey(c, 1);
  347.     pressed[c]=0;
  348.       }
  349.     }
  350.   }
  351. }
  352.  
  353. void handle_events(void)
  354. {
  355.   readmouse();
  356.   readkeyboard();
  357.  
  358.   if(dc0==1)
  359.   {
  360.     dc0=0;
  361.     disk_insert(0, dn0);
  362.     strncpy(df0, dn0, 255);
  363.   }
  364.  
  365.   if(dc1==1)
  366.   {
  367.     dc1=0;
  368.     disk_insert(1, dn1);
  369.     strncpy(df1, dn1, 255);
  370.   }
  371.  
  372.   if(dc2==1)
  373.   {
  374.     dc2=0;
  375.     disk_insert(2, dn2);
  376.     strncpy(df2, dn2, 255);
  377.   }
  378.  
  379.   if(dc3==1)
  380.   {
  381.     dc3=0;
  382.     disk_insert(3, dn3);
  383.     strncpy(df3, dn3, 255);
  384.   }
  385.  
  386.   if(dc0>1) dc0--;
  387.   if(dc1>1) dc1--;
  388.   if(dc2>1) dc2--;
  389.   if(dc3>1) dc3--;
  390.  
  391.   if (uae_running==0)
  392.     gui_process();
  393. }
  394.  
  395. int debuggable(void)
  396. {
  397.     return 0;
  398. }
  399.  
  400. int needmousehack(void)
  401. {
  402.     return 0;
  403. }
  404.  
  405. void LED(int on)
  406. {
  407. }
  408.  
  409. static void sigchldhandler(int foo)
  410. {
  411. }
  412.  
  413.  
  414. /***************************************************************************/
  415.  
  416.  
  417. int gui_init(void)
  418. {
  419.   int vout;
  420.  
  421.   quit_program=0;
  422.   uae_running=0;
  423.   uae_startedup=0;
  424.  
  425.   taskhandle=wimp_initialise(wimp_VERSION_RO35, "UAE", &messages, &vout);
  426.   gui_process();
  427.  
  428.   return 0;
  429. }
  430.  
  431. void changedisk(int n, char *f)
  432. {
  433.   if(uae_startedup)
  434.   {
  435.     switch(n)
  436.     {
  437.       case 0:
  438.     if(strcmp(df0, f)!=0)
  439.     {
  440.       strncpy(dn0, f, 255);
  441.       dc0=3;
  442.       disk_eject(0);
  443.       strncpy(df0, "", 255);
  444.     }
  445.     break;
  446.       case 1:
  447.     if(strcmp(df1, f)!=0)
  448.     {
  449.       strncpy(dn1, f, 255);
  450.       dc1=3;
  451.       disk_eject(1);
  452.       strncpy(df1, "", 255);
  453.     }
  454.     break;
  455.       case 2:
  456.     if(strcmp(df2, f)!=0)
  457.     {
  458.       strncpy(dn2, f, 255);
  459.       dc2=3;
  460.       disk_eject(2);
  461.       strncpy(df2, "", 255);
  462.     }
  463.     break;
  464.       case 3:
  465.     if(strcmp(df3, f)!=0)
  466.     {
  467.       strncpy(dn3, f, 255);
  468.       dc3=3;
  469.       disk_eject(3);
  470.       strncpy(df3, "", 255);
  471.     }
  472.     break;
  473.     }
  474.   }
  475.   else
  476.   {
  477.     switch(n)
  478.     {
  479.       case 0:
  480.     strncpy(df0, f, 255);
  481.     break;
  482.       case 1:
  483.     strncpy(df1, f, 255);
  484.     break;
  485.       case 2:
  486.     strncpy(df2, f, 255);
  487.     break;
  488.       case 3:
  489.     strncpy(df3, f, 255);
  490.     break;
  491.     }
  492.   }
  493. }
  494.  
  495. void setsonst(int *reserved)
  496. {
  497.   if(!uae_startedup)
  498.   {
  499.     gfx_requested_width=reserved[0];
  500.     gfx_requested_xcenter=reserved[1];
  501.     gfx_requested_lores=reserved[2];
  502.     gfx_requested_height=reserved[3];
  503.     gfx_requested_ycenter=reserved[4];
  504.     gfx_requested_linedbl=reserved[5];
  505.     gfx_requested_correct_aspect=reserved[6];
  506.     switch(reserved[7])
  507.     {
  508.       case 256:
  509.     color_mode=0;
  510.     break;
  511.       case 32768:
  512.     color_mode=1;
  513.     break;
  514.     }
  515.     framerate=reserved[8];
  516.     emul_accuracy=reserved[9];
  517.     blits_32bit_enabled=reserved[10];
  518.     immediate_blits=reserved[11];
  519.     fake_joystick=reserved[12];
  520.     automount_uaedev=1-reserved[13];
  521.     bogomem_size=reserved[14];
  522.     chipmem_size=reserved[15];
  523.     fastmem_size=reserved[16];
  524.     produce_sound=reserved[17];
  525.     sound_desired_freq=reserved[18];
  526.     sound_desired_bsiz=reserved[19];
  527.   }
  528. }
  529.  
  530. void sendtofront(int *reserved)
  531. {
  532.   int *words=mblock.data.reserved;
  533.  
  534.   mblock.size=256;
  535.   mblock.sender=taskhandle;
  536.   mblock.my_ref=778;
  537.   mblock.your_ref=777;
  538.   switch(*reserved)
  539.   {
  540.     case 0:
  541.       mblock.action=A_disk;
  542.       if(dc0==0)
  543.     strncpy(words, df0, 235);
  544.       else
  545.     strncpy(words, dn0, 235);
  546.       break;
  547.     case 1:
  548.       mblock.action=A_disk+1;
  549.       if(dc0==0)
  550.     strncpy(words, df1, 235);
  551.       else
  552.     strncpy(words, dn1, 235);
  553.       break;
  554.     case 2:
  555.       mblock.action=A_disk+2;
  556.       if(dc0==0)
  557.     strncpy(words, df2, 235);
  558.       else
  559.     strncpy(words, dn2, 235);
  560.       break;
  561.     case 3:
  562.       mblock.action=A_disk+3;
  563.       if(dc0==0)
  564.     strncpy(words, df3, 235);
  565.       else
  566.     strncpy(words, dn3, 235);
  567.       break;
  568.   }
  569.   wimp_send_message(wimp_USER_MESSAGE, &mblock, frontendhandle);
  570. }
  571.  
  572. void gui_messagereceive(void)
  573. {
  574.   switch(block.message.action)
  575.   {
  576.     case message_QUIT:
  577.       if(uae_startedup)
  578.       {
  579.     regs.spcflags |= SPCFLAG_BRK;
  580.     quit_program=1;
  581.     uae_running=1;
  582.       }
  583.       else
  584.       {
  585.     if(uaedevfd!=-1)
  586.     {
  587.       close(uaedevfd);
  588.     }
  589.     wimp_close_down(taskhandle);
  590.       }
  591.       break;
  592.     case A_switch:
  593.       if(uae_startedup)
  594.       {
  595.     uae_running=1;
  596.     setuaemode();
  597.     setuaesound();
  598.       }
  599.       else
  600.       {
  601.     frontendhandle=block.message.sender;
  602.     uae_startedup=1;
  603.     uae_running=1;
  604.       }
  605.       break;
  606.     case A_disk:
  607.       changedisk(0, block.message.data.reserved);
  608.       break;
  609.     case A_disk+1:
  610.       changedisk(1, block.message.data.reserved);
  611.       break;
  612.     case A_disk+2:
  613.       changedisk(2, block.message.data.reserved);
  614.       break;
  615.     case A_disk+3:
  616.       changedisk(3, block.message.data.reserved);
  617.       break;
  618.     case A_sonst:
  619.       setsonst(block.message.data.reserved);
  620.       break;
  621.     case A_rom:
  622.       strncpy(romfile, block.message.data.reserved, 235);
  623.       break;
  624.     case A_mount:
  625.       strncpy(mountpoint, block.message.data.reserved, 63);
  626.       break;
  627.     case A_mount+1:
  628.       strncpy(mountdir, block.message.data.reserved, 235);
  629.       add_filesys_unit(mountpoint, mountdir, 0);
  630.       break;
  631.     case A_mount+2:
  632.       strncpy(mountdir, block.message.data.reserved, 235);
  633.       add_filesys_unit(mountpoint, mountdir, 1);
  634.       break;
  635.     case A_uaeask:
  636.       sendtofront(block.message.data.reserved);
  637.       break;
  638.   }
  639. }
  640.  
  641. void gui_process(void)
  642. {
  643.   wimp_event_no event;
  644.  
  645.   while(uae_running==0)
  646.   {
  647.     event=wimp_poll(wimp_MASK_NULL, &block, 0);
  648.  
  649.     switch(event)
  650.     {
  651.       case wimp_USER_MESSAGE:
  652.       case wimp_USER_MESSAGE_RECORDED:
  653.     gui_messagereceive();
  654.     break;
  655.     }
  656.   }
  657. }
  658.  
  659. void gui_exit(void)
  660. {
  661. }
  662.  
  663. void gui_led(int led, int on)
  664. {
  665. }
  666.  
  667. void gui_filename(int num, char *name)
  668. {
  669. }
  670.  
  671. void gui_handle_events(void)
  672. {
  673. }
  674.  
  675. int gui_update(void)
  676. {
  677. }
  678.  
  679.